package mail3;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class ReceiveMail {

	// 21-30行把本程序所用变量进行定义。 具体在main中对它们赋植。
	private MimeMessage mimeMsg; // MIME邮件对象
	private Session session; // 邮件会话对象
	private Properties props; // 系统属性
	private boolean needAuth = false; // smtp是否需要认证
	private String username = "dmu_service"; // smtp认证用户名和密码
	private String password = "p@ssword123!";
	private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成//MimeMessage对象
	private MimeMessage mimeMessage = null;
	private String saveAttachPath = "D://"; // 附件下载后的存放目录
	public ReceiveMail(MimeMessage mimeMessage) {
		this.mimeMessage = mimeMessage;
	}
	public ReceiveMail(String smtp) {
		setSmtpHost(smtp);
		createMimeMessage();
	}

	public ReceiveMail() {
	}

	public void setSmtpHost(String hostName) {
		System.out.println("设置系统属性：mail.smtp.host = " + hostName);
		if (props == null)
			props = System.getProperties(); // 获得系统属性对象
		System.out.println("hostName:"+hostName);
		props.put("mail.smtp.host", hostName);
	}

	public boolean createMimeMessage() {
		boolean flag = false;
		try {
			System.out.println("准备获取邮件会话对象！");
			session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
		} catch (Exception e) {
			System.err.println("获取邮件会话对象时发生错误！" + e);
			flag = false;
		}
		System.out.println("准备创建MIME邮件对象！");
		try {
			mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
			mp = new MimeMultipart(); // mp 一个multipart对象
			flag = true;
		} catch (Exception e) {
			System.err.println("创建MIME邮件对象失败！" + e);
			flag = false;
		}
		return flag;
	}

	public void setNeedAuth(boolean need) {
		System.out.println("设置smtp身份认证：mail.smtp.auth = " + need);
		if (props == null)
			props = System.getProperties();
		if (need) {
			props.put("mail.smtp.auth", "false");
			props.put("mail.smtp.quitwait", "false");
		} else {
			props.put("mail.smtp.auth", "false");
			props.put("mail.smtp.quitwait", "false");
		}
	}

	public void setNamePass(String name, String pass) {
		System.out.println("程序得到用户名与密码");
		username = name;
		password = pass;
	}

	public boolean setSubject(String mailSubject) {
		System.out.println("设置邮件主题！");
		try {
			mimeMsg.setSubject(mailSubject);
			return true;
		} catch (Exception e) {
			System.err.println("设置邮件主题发生错误！");
			return false;
		}
	}

	public boolean setBody(String mailBody) {
		try {
			System.out.println("设置邮件体格式");
			BodyPart bp = new MimeBodyPart();
			bp.setContent(
					"<meta http-equiv=Content-Type content=text/html; charset=gb2312>"
							+ mailBody, "text/html;charset=GB2312");
			mp.addBodyPart(bp);
			return true;
		} catch (Exception e) {
			System.err.println("设置邮件正文时发生错误！" + e);
			return false;
		}
	}

	public boolean addFileAffix(String filename) {
		System.out.println("增加邮件附件：" + filename);
		try {
			BodyPart bp = new MimeBodyPart();
			FileDataSource fileds = new FileDataSource(filename);
			bp.setDataHandler(new DataHandler(fileds));
			bp.setFileName(fileds.getName());
			mp.addBodyPart(bp);
			return true;
		} catch (Exception e) {
			System.err.println("增加邮件附件：" + filename + "发生错误！" + e);
			return false;
		}
	}

	public boolean setFrom(String from) {
		System.out.println("设置发信人！");
		try {
			mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public boolean setTo(String to) {
		System.out.println("设置收信人");
		if (to == null) {
			return false;
		}
		try {
			mimeMsg.setRecipients(Message.RecipientType.TO,
					InternetAddress.parse(to));
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public boolean setCopyTo(String copyto) {
		System.out.println("发送附件到");
		if (copyto == null)
			return false;
		try {
			mimeMsg.setRecipients(Message.RecipientType.CC,
					(Address[]) InternetAddress.parse(copyto));
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	// 发送邮件
	public boolean sendout() {
		try {
			mimeMsg.setContent(mp);
			mimeMsg.saveChanges();
			System.out.println("正在发送邮件....");
			Session mailSession = Session.getInstance(props, null);
			Transport transport = mailSession.getTransport("smtp"); // 
			transport.connect((String) props.get("mail.smtp.host"), username,
					password);
			transport.sendMessage(mimeMsg,
					mimeMsg.getRecipients(Message.RecipientType.TO));
			// transport.send(mimeMsg);
			System.out.println("content.." + mimeMsg.toString());
			System.out.println("发送邮件成功！");
			transport.close();
			return true;
		} catch (Exception e) {
			System.err.println("邮件发送失败！" + e);
			return false;
		}
	}

	public void saveAttachment(Part part) {
		try {
			String fileName = "";
			if (part.isMimeType("multipart/*")) {
				Multipart mp = (Multipart) part.getContent();
				for (int i = 0; i < mp.getCount(); i++) {
					BodyPart mpart = mp.getBodyPart(i);
					String disposition = mpart.getDisposition();
					if ((disposition != null)
							&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
									.equals(Part.INLINE)))) {
						fileName = mpart.getFileName();
						if (fileName.toLowerCase().indexOf("gbk") != -1) {
							fileName = MimeUtility.decodeText(fileName);
						}
						saveFile(fileName, mpart.getInputStream());
					} else if (mpart.isMimeType("multipart/*")) {
						saveAttachment(mpart);
					} else {
						fileName = mpart.getFileName();
						if ((fileName != null)
								&& (fileName.toLowerCase().indexOf("GB2312") != -1)) {
							fileName = MimeUtility.decodeText(fileName);
							saveFile(fileName, mpart.getInputStream());
						}
					}
				}
			} else if (part.isMimeType("message/rfc822")) {
				saveAttachment((Part) part.getContent());
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取文件扩展名
	 * 
	 * @param filename
	 * @return
	 */
	public static String getExtensionName(String fileName) {
		String extensionName = "";
		if ((fileName != null) && (fileName.length() > 0)) {
			int dot = fileName.lastIndexOf('.');
			if ((dot > -1) && (dot < (fileName.length() - 1))) {
				extensionName = fileName.substring(dot + 1);
				// excel文件扩展名有两种常用形式.xls和.xlsx，此两种扩展名统一放在xlsx目录下
				if (extensionName.equalsIgnoreCase("pdf")) {
					extensionName = "pdf";
				}
				return extensionName;
			}
		}

		return extensionName;
	}

	/**
	 * 获得附件存放路径
	 */
	public String getAttachPath() {
		return saveAttachPath;
	}
	/**
	 * 真正的保存附件到指定目录里
	 */
	private void saveFile(String fileName, InputStream in) {
		String osName = System.getProperty("os.name");
		String storedir = getAttachPath();
		String separator = "";
		String extensionName = "";
		if (osName == null)
			osName = "";
		if (osName.toLowerCase().indexOf("win") != -1) {
			separator = "//";
			if (storedir == null || storedir.equals("")) {
				storedir = "D://tmp//";
			}
		} else {
			separator = "/";
			storedir = "/tmp";
		}

		// pdf和excel文件分开放在临时目录下
		extensionName = ReceiveMail.getExtensionName(fileName);
		storedir += extensionName;

		// fileName = UIDGenerator.getUID();
		File storefile = null;
		try {
			storefile = new File(MimeUtility.decodeText(storedir)
					+ MimeUtility.decodeText(separator)
					+ MimeUtility.decodeText(fileName));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		// System.out.println("storefile's path: " + storefile.toString());
		// for(int i=0;storefile.exists();i++){
		// storefile = new File(storedir+separator+fileName+i);
		// }
		BufferedOutputStream bos = null;
		BufferedInputStream bis = null;
		try {
			bos = new BufferedOutputStream(new FileOutputStream(storefile));
			bis = new BufferedInputStream(in);
			int c;
			while ((c = bis.read()) != -1) {
				bos.write(c);
				bos.flush();
			}
		} catch (Exception exception) {
			exception.printStackTrace();
			// throw new Exception("文件保存失败!");
		} finally {
			try {
				bos.close();
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void sendMail() {
		String mailbody = "测试 1";

		ReceiveMail themail = new ReceiveMail("ex.mychery.com");
		themail.setNeedAuth(false);
		if (themail.setSubject("这是主题") == false)
			return;
		// 邮件内容 支持html 如 <font color=red>欢迎光临</font> <a
		// href=\"http://www.laabc.com\">啦ABC</a>
		if (themail.setBody(mailbody) == false)
			return;
		// 收件人邮箱
		if (themail.setTo("919082823@qq.com") == false)
			return;
		// 发件人邮箱
		if (themail.setFrom("dmu_service@mychery.com") == false)
			return;
		// 设置附件
//		themail.addFileAffix("D:\\1.pdf");
//		themail.addFileAffix("D:\\2.pdf");
//		themail.addFileAffix("D:\\3.pdf");
		
		// if (themail.addFileAffix("D:\\crm2.pdf") == false)
		// return; // 附件在本地机子上的绝对路径
		themail.setNamePass("dmu_service", "p@ssword123!"); // 用户名与密码
		themail.sendout();
	}

	public void getMail() {
		try {
			Properties properties = System.getProperties();
			properties.put("mail.store.protocol", "imap");  
            properties.put("mail.imap.host", "imap.mychery.com");  
			Session session = Session.getDefaultInstance(properties);
			Store store = session.getStore("imap");
			store.connect("imap.mychery.com", "username", "password");

			Folder folder = store.getDefaultFolder();
			folder = folder.getFolder("INBOX");
			folder.open(Folder.READ_WRITE);
			System.out.println("新邮件:" + folder.getUnreadMessageCount());
			Message[] message = folder.getMessages();

			System.out.println("mail count:" + message.length);

			for (int i = 0; i < message.length; i++) {
				if (!message[i].getFlags().contains(Flags.Flag.SEEN)) {
					message[i].setFlag(Flags.Flag.SEEN, true);
					ReceiveMail receiveMail = new ReceiveMail((MimeMessage) message[i]);
					receiveMail.saveAttachment((Part) message[i]);
				}
			}
			System.out.println("接收完毕");
			folder.close(false);
			store.close();
		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

	public static void main(String[] args) {
		ReceiveMail mail = new ReceiveMail("smtp.163.com");
		//mail.sendMail();
		mail.sendMail();
	}
}

